import logging
import os
import sys
from logging.handlers import TimedRotatingFileHandler


def setup_logger(name, log_dir="logs", log_level=logging.INFO, console_level=logging.INFO):
    """
    配置并返回一个日志记录器

    参数:
        name: 日志记录器名称 (通常使用 __name__)
        log_dir: 日志文件存储目录
        log_level: 文件日志级别
        console_level: 控制台日志级别

    返回:
        logging.Logger: 配置好的日志记录器
    """
    # 确保日志目录存在
    os.makedirs(log_dir, exist_ok=True)

    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)  # 设置为最低级别，由处理器控制实际级别

    # 清除现有处理器，避免重复日志
    if logger.hasHandlers():
        for handler in logger.handlers[:]:
            logger.removeHandler(handler)

    # 创建文件处理器 - 每天轮换，保留7天
    log_file = os.path.join(log_dir, f"{name}.log")
    file_handler = TimedRotatingFileHandler(
        log_file, when="midnight", interval=1, backupCount=7
    )
    file_handler.setLevel(log_level)

    # 创建控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(console_level)

    # 创建格式化器
    file_formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

    console_formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%H:%M:%S'
    )

    # 应用格式化器
    file_handler.setFormatter(file_formatter)
    console_handler.setFormatter(console_formatter)

    # 添加处理器到日志记录器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    # 添加未捕获异常处理
    def handle_exception(exc_type, exc_value, exc_traceback):
        if issubclass(exc_type, KeyboardInterrupt):
            sys.__excepthook__(exc_type, exc_value, exc_traceback)
            return

        logger.critical("未捕获的异常", exc_info=(exc_type, exc_value, exc_traceback))

    sys.excepthook = handle_exception

    return logger


def log_dataframe(logger, df, name, max_rows=5):
    """
    记录DataFrame的摘要信息

    参数:
        logger: 日志记录器
        df: 要记录的DataFrame
        name: DataFrame的名称
        max_rows: 最大记录行数
    """
    if logger.getEffectiveLevel() > logging.DEBUG:
        return

    if df.empty:
        logger.debug(f"{name} 为空DataFrame")
        return

    # 创建摘要信息
    summary = [
        f"{name} 摘要 ({len(df)} 行, {len(df.columns)} 列):",
        f"日期范围: {df.index.min()} 至 {df.index.max()}" if 'datetime' in df.index.name else "",
        f"列: {', '.join(df.columns)}",
        f"前{max_rows}行:",
        df.head(max_rows).to_string()
    ]

    logger.debug("\n".join(summary))


def log_dates(logger, dates, name):
    """
    记录日期范围信息

    参数:
        logger: 日志记录器
        dates: 日期序列
        name: 日期范围的名称
    """
    if logger.getEffectiveLevel() > logging.INFO:
        return

    if len(dates) == 0:
        logger.warning(f"{name} 无有效日期")
        return

    logger.info(f"{name}: {dates.min()} 至 {dates.max()} (共 {len(dates)} 天)")